package com.hspedu.innerclass;

public class AnonymousInnerClassDetail {
    public static void main(String[] args) {
        Outer03 outer03 = new Outer03();
        outer03.f1();
        System.out.println("outer03 hashcode=" + outer03.hashCode());
    }
}

class Outer03{
    private int n1 = 99;

    public void f1(){
        //创建一个匿名内部类
        Person p = new Person(){
            private  int n1 = 200;
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了 hi方法");
                System.out.println("匿名类中的 n1="+n1);//200
                System.out.println("外部类中的 n1="+Outer03.this.n1);//99
                //Outer03.this 就是调用f1 的那个对象
                System.out.println("Outer03.this hashcode=" + Outer03.this.hashCode());
            }
        };
        p.hi();//动态绑定，找到匿名类中的hi

        //也可以直接调用，匿名内部类本身也是返回对象的,参数也可以穿
        new Person(){

            @Override
            public void hi() {
                System.out.println("匿名内部类重写了 hi方法,哈哈哈");

            }

            @Override
            public void ok(String str) {
                System.out.println("匿名类 ok() " + str);
            }
        }.ok("jack");
    }
}

class Person{

    public void hi(){
        System.out.println("Person hi()方法");
    }

    public void ok(String str){
        System.out.println("Person ok() " + str);
    }
}